﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CANO.Data.DAOs.Usuario;

namespace CANO.Data.DAOs
{
	public class ContactoDAO
	{
		//DTO
		public int ContactoID { get; set; }
		public string Nombre { get; set; }
		public string Apellido { get; set; }
		public int? Profesion { get; set; }
		public DateTime? FechaOrigen { get; set; }
		public string Email { get; set; }
		public string DireccionPersonal { get; set; }
		public string Dni { get; set; }
		public DateTime? FechaNacimiento { get; set; }
		public string PaginaWeb { get; set; }
		public string EmailSecundario { get; set; }
		public string CuilCuit { get; set; }
		public int? LugarInfluencia { get; set; }
		public int? TipoPropiedad { get; set; }
		public int? IsPropietario { get; set; }
		public int? Nacionalidad { get; set; }
		public int? Especialidad { get; set; }
		public string Notas { get; set; }
		public string DireccionLaboral { get; set; }
		public DateTime? LastUpdate { get; set; }
		public string HasObservacion { get; set; }
		public string HasCompromisoAsignado { get; set; }
		public string Celular { get; set; }
		
		public string NombreConyuge { get; set; }
		public string ContactoConyuge { get; set; }
		public string NombreHijos { get; set; }
		public string LastUpdateShort { get; set; }
		public string FullName { get; set; }

		//26/12
		public string LastUpdateDisplay { get; set; }

		//Static Mehtods
		public static ContactoDAO getContact(string id)
		{

			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var clients =
					from c in context.Contactos
					where c.ContactoID == Convert.ToInt32(id)
					select c;

				ContactoDAO clienteRet = new ContactoDAO();
				fillDAO(clienteRet, clients.SingleOrDefault());

				return clienteRet;
			}
		}

		
		public List<ContactoDAO> GetContacts()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				List<ContactoDAO> contactsList = new List<ContactoDAO>();

				var contacts =
					from c in context.Contactos
					where c.Status == null
					orderby c.LastUpdate descending
					select c;

				foreach (var item in contacts)
				{
					ContactoDAO contactoDAO = new ContactoDAO();

					fillDAO(contactoDAO, item);
					contactsList.Add(contactoDAO);
				}
				return contactsList;
			}
		}

		public List<ContactoDAO> GetContactsForSearch(string KeySearched, string userId)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				List<ContactoDAO> contactsList = new List<ContactoDAO>();

				//var contacts =
				//    from c in context.Contactos
				//    join a in context.Asignacion on c.ContactoID equals a.Contacto
				//    where c.Status == null && ( c.Nombre.ToLower().Contains(KeySearched) || c.Apellido.ToLower().ToLower().Contains(KeySearched) || 
				//    c.Email.ToLower().Contains(KeySearched) || c.EmailSecundario.ToLower().Contains(KeySearched) || 
				//    c.DireccionPersonal.ToLower().Contains(KeySearched) || c.DireccionLaboral.ToLower().Contains(KeySearched) || 
				//    c.ConyugeNombre.ToLower().Contains(KeySearched) || c.ConyugeContacto.ToLower().Contains(KeySearched) || c.HijosNombres.ToLower().Contains(KeySearched) || 
				//    c.PaginaWeb.ToLower().Contains(KeySearched) || c.Notas.ToLower().Contains(KeySearched)) && a.Usuario == Convert.ToInt32(userId)
				//    orderby c.LastUpdate descending
				//    select c;

				var contacts = context.spGetContactBySearchBox(Convert.ToInt32(userId), KeySearched);

				foreach (var item in contacts)
				{
					ContactoDAO contactoDAO = new ContactoDAO() { FullName = item.Apellido + ", " + item.Nombre, ContactoID = item.ContactoID};
					contactsList.Add(contactoDAO);
				}
				return contactsList;
			}
		}

        public List<ContactoDAO> GetContactsForSearchAdmin(string KeySearched)
        {
            using (dcCanoDataContext context = new dcCanoDataContext())
            {
                List<ContactoDAO> contactsList = new List<ContactoDAO>();

                //var contacts =
                //    from c in context.Contactos
                //    join a in context.Asignacion on c.ContactoID equals a.Contacto
                //    where c.Status == null && ( c.Nombre.ToLower().Contains(KeySearched) || c.Apellido.ToLower().ToLower().Contains(KeySearched) || 
                //    c.Email.ToLower().Contains(KeySearched) || c.EmailSecundario.ToLower().Contains(KeySearched) || 
                //    c.DireccionPersonal.ToLower().Contains(KeySearched) || c.DireccionLaboral.ToLower().Contains(KeySearched) || 
                //    c.ConyugeNombre.ToLower().Contains(KeySearched) || c.ConyugeContacto.ToLower().Contains(KeySearched) || c.HijosNombres.ToLower().Contains(KeySearched) || 
                //    c.PaginaWeb.ToLower().Contains(KeySearched) || c.Notas.ToLower().Contains(KeySearched)) && a.Usuario == Convert.ToInt32(userId)
                //    orderby c.LastUpdate descending
                //    select c;

                var contacts = context.spGetContactBySearchBoxGerencial(KeySearched);

                foreach (var item in contacts)
                {
                    ContactoDAO contactoDAO = new ContactoDAO() { FullName = item.Apellido + ", " + item.Nombre, ContactoID = item.ContactoID };
                    contactsList.Add(contactoDAO);
                }
                return contactsList;
            }
        }


		public List<ContactoDAO> GetContactsByUserID(int UserID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				List<ContactoDAO> contactsList = new List<ContactoDAO>();

				//ToDo: Validar si es Gerencial o Asistente
				if (UserHelper.IsBroker(new RolDAO().GetRolByUserID(UserID).RolID))
				{
					var contacts =
						from c in context.Contactos
						join a in context.Asignacions on c.ContactoID equals a.Contacto

						where a.Usuario == UserID
						orderby c.LastUpdate descending
						select c;
					foreach (var item in contacts)
					{
						if (item.Status != null)
							continue;
						ContactoDAO contactoDAO = new ContactoDAO();

						fillDAO(contactoDAO, item);
						contactsList.Add(contactoDAO);
					}
				}
				else
				{
					var contacts =
						from c in context.Contactos
						where  c.Status == null
						orderby c.LastUpdate descending
						select c;
					foreach (var item in contacts)
					{
						ContactoDAO contactoDAO = new ContactoDAO();

						fillDAO(contactoDAO, item);
						contactsList.Add(contactoDAO);
					}
				}

			
				return contactsList;
			}
		}

		public static int create(ContactoDAO contactoDAO)
		{
            using (dcCanoDataContext context = new dcCanoDataContext())
			{
                try
                {
                    Contacto newContact = new Contacto();
                    fillContacto(contactoDAO, newContact);

                    context.Contactos.InsertOnSubmit(newContact);

                    context.SubmitChanges();

                    return newContact.ContactoID;
                }
                catch (Exception)
                {
                    return 0;
                }
				
			}
		}

		public static void AddCelular(int ContactID, string Celular)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				context.ContactoTelefonos.InsertOnSubmit(new ContactoTelefono() 
				{ 
					Contacto = ContactID, 
					Telefono = Celular, 
					TipoTelefono = 1
				});

				context.SubmitChanges();
			}
			
			
		}
		public static void update(ContactoDAO contactoDAO)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var client =
					(from c in context.Contactos
					 where c.ContactoID == contactoDAO.ContactoID
					 select c).Single();

				fillContacto(contactoDAO, client);

				context.SubmitChanges();
			}
		}
		//Private Methods
		private static void fillDAO(ContactoDAO contactoDAO, CANO.Data.Contacto contacto)
		{
			contactoDAO.ContactoID = contacto.ContactoID;
			contactoDAO.Nombre = contacto.Nombre;
			contactoDAO.Apellido = contacto.Apellido;
			contactoDAO.Profesion = contacto.Profesion;
			contactoDAO.FechaOrigen = contacto.FechaOrigen;
			contactoDAO.Email = contacto.Email;
			contactoDAO.DireccionPersonal = contacto.DireccionPersonal;
			contactoDAO.Dni = contacto.DNI;
            //contactoDAO.FechaNacimiento = (!string.IsNullOrEmpty(contacto.FechaNacimiento)) ? Convert.ToDateTime(contacto.FechaNacimiento) : null;
            if (contacto.FechaNacimiento.HasValue)
                contactoDAO.FechaNacimiento = contacto.FechaNacimiento;
	
			contactoDAO.PaginaWeb = contacto.PaginaWeb;
			contactoDAO.EmailSecundario = contacto.EmailSecundario;
			contactoDAO.CuilCuit = contacto.CUILCUIT;
			contactoDAO.LugarInfluencia = contacto.LugarInfluencia;
			contactoDAO.TipoPropiedad = contacto.TipoPropiedad;
			contactoDAO.IsPropietario = contacto.Propietario;
			contactoDAO.Nacionalidad = contacto.Nacionalidad;
			contactoDAO.Especialidad = contacto.Especialidad;
			contactoDAO.Notas = contacto.Notas;
			contactoDAO.DireccionLaboral = contacto.DireccionLaboral;
            if(contacto.LastUpdate.HasValue)
			    contactoDAO.LastUpdateDisplay = contacto.LastUpdate.Value.ToShortDateString();
			contactoDAO.LastUpdate = contacto.LastUpdate;
			contactoDAO.DireccionLaboral = contacto.DireccionLaboral;
			if (contacto.Compromisos.Count > 0)
				contactoDAO.HasCompromisoAsignado = "Si";
			else
				contactoDAO.HasCompromisoAsignado = "No";
			
			if (contacto.ObservacionContactos.Count > 0)
				contactoDAO.HasObservacion = "Si";
			else
				contactoDAO.HasObservacion = "No";

			contactoDAO.Celular = getCelularByContactID(contacto.ContactoID);
			contactoDAO.FullName = contacto.Apellido + ", " + contacto.Nombre;
			contactoDAO.NombreConyuge = contacto.ConyugeNombre;
			contactoDAO.ContactoConyuge = contacto.ConyugeContacto;
			contactoDAO.NombreHijos = contacto.HijosNombres;
			if(contacto.LastUpdate.HasValue)
				contactoDAO.LastUpdateShort = contacto.LastUpdate.Value.ToShortDateString() + " " + contacto.LastUpdate.Value.ToShortTimeString();
		}

        private static void fillContacto(ContactoDAO contactoDAO, CANO.Data.Contacto contacto)
		{
			contacto.ContactoID = contactoDAO.ContactoID;
			contacto.Nombre = contactoDAO.Nombre;
			contacto.Apellido = contactoDAO.Apellido;
			contacto.Profesion = contactoDAO.Profesion;
			contacto.FechaOrigen = contactoDAO.FechaOrigen;
			contacto.Email = contactoDAO.Email;
			contacto.DireccionPersonal = contactoDAO.DireccionPersonal;
			contacto.DNI = contactoDAO.Dni;
            
            if(contactoDAO.FechaNacimiento.HasValue)
                contacto.FechaNacimiento = contactoDAO.FechaNacimiento;

			contacto.PaginaWeb = contactoDAO.PaginaWeb;
			contacto.EmailSecundario = contactoDAO.EmailSecundario;
			contacto.CUILCUIT = contactoDAO.CuilCuit;
			contacto.LugarInfluencia = contactoDAO.LugarInfluencia;
			contacto.TipoPropiedad = contactoDAO.TipoPropiedad;
			contacto.Propietario = contactoDAO.IsPropietario;
			contacto.Nacionalidad = contactoDAO.Nacionalidad;
			contacto.Especialidad = contactoDAO.Especialidad;
			contacto.Notas = contactoDAO.Notas;
			contacto.ConyugeNombre = contactoDAO.NombreConyuge;
			contacto.ConyugeContacto = contactoDAO.ContactoConyuge;
			contacto.HijosNombres = contactoDAO.NombreHijos;
			contacto.LastUpdate = contactoDAO.LastUpdate;
			contacto.DireccionLaboral = contactoDAO.DireccionLaboral;
			
		}

		private static string getCelularByContactID(int ContactID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				try
				{
					var celular =
					from c in context.ContactoTelefonos
					where c.TipoTelefono == 1 && c.Contacto == ContactID
					select c;
					return celular.SingleOrDefault().Telefono;
				}
				catch (Exception)
				{
					return "Sin celular";
				}
				
			}
		}

		public string GetNameByID(int ContactID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				try
				{
					var displayName =
					from c in context.Contactos
					where c.ContactoID == ContactID
					select c;
					return displayName.SingleOrDefault().Apellido + ", " + displayName.SingleOrDefault().Nombre;
				}
				catch (Exception)
				{
					return "Sin Nombre";
				}

			}
		}

		public bool IsUnique(string Apellido, string Nombre)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				try
				{
					var contact =
						from c in context.Contactos
						where c.Apellido.ToUpper() == Apellido.ToUpper() && c.Nombre.ToUpper() == Nombre.ToUpper()
						select c;
					if (contact.Count() > 0)
						return false;
					else
						return true;
				}
				catch (Exception)
				{
					return false;
				}

			}
		}

        public static bool ValidateIfExist(ContactoDAO ContactToValidate)
        {
            using (dcCanoDataContext context = new dcCanoDataContext())
            {
                try
                {
                    var contact =
                        from c in context.Contactos
                        where (c.Apellido.ToUpper() == ContactToValidate.Apellido.ToUpper() && //Same Name and Lastname
                                c.Nombre.ToUpper() == ContactToValidate.Nombre.ToUpper()
                                ) ||
                                (c.Email.ToUpper() == ContactToValidate.Email.ToUpper() && //Same mail
                                c.EmailSecundario.ToUpper() == ContactToValidate.EmailSecundario.ToUpper()
                                )                                
                        select c;

                    if (contact.Count() > 0)
                        return true;
                    else
                        return false;
                }
                catch (Exception)
                {
                    throw;
                }

            }

        }
		public void Delete(int ContactID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var client =
					(from c in context.Contactos
					 where c.ContactoID == ContactID
					 select c).Single();

				client.Status = 1; //Delete

				context.SubmitChanges();
			}
		}
	}
}
